|
===================================== 〔語彙分解〕的な部分一致の検索結果は以下の通りです。 ・ F : [えふ] ファロー四徴(症)
f00f("foof"と発音する)は、IntelのPentium、Pentium MMX、Pentiumオーバードライブプロセッサの、ある世代以前のモデルにある、公開されている設計上の不具合の通称である。問題〔OS側で特別の対策をしていないとプロセッサが止まる。〕を起こす機械語バイト列「f0 0f c7 c8」の先頭2バイトの16進表現に由来する。 Intelはこの問題を「ロックされたCMPXCHG8B インストラクションでの不正なオペランド」と呼んでいる。 == 内容 == 問題を起こす機械語コード(f0 0f c7 c8)に対応するアセンブリ言語表現は以下のようになる。本来はメモリオペランドを指定して使用する前提の命令であり、アセンブラによってはエラーとされアセンブルを拒否されるかもしれない。 lock cmpxchg8b eax ''不具合を引き起こすにはオペランドはレジスタである必要がある。ここでは例示としてeaxをオペランドにしているが、その他のレジスタでもよい。'' ''cmpxchg8b''命令は、オペランドとして指定されたアドレスのメモリ上の8byteの領域を取る。この命令を実行すると、''edx:eax''の値とメモリ上の8byte値を比較し、一致したらZフラグをセットするとともに''ecx:ebx''の値をこの8byte領域にストアし、一致しなければZフラグをクリアするとともに8byteのデータを''edx:eax''にロードする(コンペア・アンド・スワップ、詳細はリファレンスマニュアル等を参照)。ただし、この命令の機械語では、命令フォーマット上はオペランドにレジスタも指定することが許容される。そして、レジスタオペランドを指定したcmpxchg8b命令を、lockプレフィクス付で実行すると、この不具合が引き起こされる。 lockプレフィックス〔排他制御を指示するもので、同じメモリアドレスに対して2つのプロセッサが競合しないように使われる。〕なしでは、この命令は不正命令例外を引き起こすだけである。即ち、レジスタペア''edx:eax''に格納された8byte=64bitのデータと、指定されたレジスタ、上記の例では''eax''に格納された4byte=32bitのデータの比較は妥当ではないからである。 しかし、lockプリフィックスを付けた場合、以後のメモリアクセスが抑制されるために、プロセッサは不正命令例外ハンドラに移行することができず、この段階でハングアップし以後は一切の命令をせず、割り込みも受け付けなくなってしまう。復旧するにはシステムを再起動しなければならない。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「Pentium F00F バグ」の詳細全文を読む スポンサード リンク
|